#include "hspdsc.as" #include "gdi32.as" title "DirectShow キャプチャデバイス表示(モノクロキャプチャ)" cls 4 dsc_Init // 初期化 // デバイスリスト用の変数を初期化 sdim devname, dsc_GetDeviceListSize() // デバイスリストを変数に格納 dsc_GetDeviceList devname, 0 if stat == 0 || stat == -2 : dialog "デバイスが見つかりません" : end objsize 300, 20 combox id, 100, devname objsize 150,20 button "デバイスを再生",*play button "デバイスを停止",*_stop button "プロパティを表示",*prop button "解像度プロパティを表示",*prop2 button "プロパティ表示(自前)",*prop3 button "キャプチャして表示",*capture button "モノクロキャプチャ表示",*monocap button "BMPで保存して表示",*savebmp button gosub "終了する",*exit onexit gosub *exit stop *play // 再生処理 dsc_SetActiveSel 0 dsc_Open id, 0, 0, 0, 0 if stat < 0 : dialog "エラーが発生しました。",1,"DEVICE-ERROR" : stop gsel 0, 1 dsc_Play hwnd, 160, 120, 320, 240 if stat < 0 : dialog "エラーが発生しました。",1,"CAPTURE-ERROR" : stop gsel 0,1 stop *_stop // 停止&クローズ dsc_Stop dsc_Close stop *prop // 再生中でないと失敗します。 dsc_FilterProp hwnd, "Device Filter" stop *prop2 // dsc_playを使う前でないとうまく実行できない為、再生中の場合は一度リセットする。 dsc_Stop dsc_Close // クローズする dsc_Open id, 1, 0, 1, 1 // 再度オープン gsel 0, 1 dsc_DevPinProp hwnd // ここでプロパティを表示 dsc_Play hwnd, 160, 120, 320, 240 // 再び再生 stop *capture // サイズ取得 w = dsc_CapW h = dsc_CapH // ビデオのサイズが0以下だった場合 if w <= 0 || h <= 0 : dialog "サイズ取得エラー" : stop screen 1, w, h dsc_GetImage hdc, 0, 0, w, h redraw 1 // これは必ず必要 gsel 0, 1 stop *monocap if dsc_GetImageMemSize(0) <= 0 || dsc_GetImageMemSize(1) <= 0 : dialog "サイズ取得エラー" : stop sdim dibdata, dsc_GetImageMemSize(0)+1 ; 下の対策のため +1 sdim dibhead, dsc_GetImageMemSize(1) dibsize = dsc_GetImageMemSize(0) dsc_GetImageMem dibdata, dibsize, dibhead // 取得した画像の X ,Y サイズ x = lpeek(dibhead,4) y = lpeek(dibhead,8) if x <= 0 || y <= 0 : dialog "サイズ取得エラー" : stop // 白黒(モノクロ)化処理 repeat dibsize/3 /* 24bit Color */ // 閾値 チェック if peek(dibdata, cnt*3+2) > 128 { /* DIB は RGB ではなく BGR 順 */ // 高速化のため 4byte ずつ 書き込みするので 確保バッファあらかじめ +1 する lpoke dibdata, cnt*3, 16777215 }else{ lpoke dibdata, cnt*3, 0 } loop // 加工後の画像 screen 1, x, y : title "加工後の画像" SetDIBitsToDevice hdc, 0, 0, x, y, 0, 0, 0, y, varptr(dibdata), varptr(dibhead), 0 redraw 1 gsel 0, 1 stop *savebmp dsc_SaveBMP "test.bmp" wait 5 // ちょっと待たせたほうがいいかも exist "test.bmp" if strsize != -1{ screen 1, 32, 32 picload "test.bmp" gsel 0,1 } stop *exit dsc_Stop dsc_Close end *prop3 // サイズとFourCCを取得します dialog "サイズ:"+dsc_CapW+"x"+dsc_CapH+"\nFourCC:"+dsc_FourCC+"\n"+strf("%2.2ffps",double((1.0 * 10 * 1000 * 1000) / dsc_AvgFrame)) stop